Svolgere i seguenti esercizi applicando le nozioni di pensiero computazionale. Risolvere gli stessi esercizi scrivendo un programma python.

# Fornire un algoritmo che calcoli il numero di caratteri di una stringa.

# Fornire un algoritmo che calcoli il numero di caratteri che rappresentano numeri in una stringa.

# Fornire un algoritmo che calcoli il numero di caratteri che non rappresentano numeri in una stringa.

# Fornire un algoritmo che, presa in input una stringa x, sia in grado di calcolare il numero di vocali in essa contenute.

# Fornire un algoritmo che, presa in input una stringa x, restituisca una stringa contenente i caratteri di x in posizione pari (partendo da 0).

# Fornire un algoritmo che, presa in input una stringa x, restituisca una stringa contentente caratteri in posizione dispari (partendo da 0).

# Fornire un algoritmo che, dato un numero t e una stringa x restituisca tutti i caratteri di x tranne quello in posizione t. 

# Fornire un algoritmo che, dato un numero t e una stringa x restituisca il carattere di x in posizione t. 

# Fornire un algoritmo che, prese due stringhe x e y, restituisca una stringa costituita da metà della stringa x seguita dalla metà della stringa y.

# Fornire un algoritmo che, presi una stringa x e un carattere c, restituisca la stringa ottenuta dai caratteri di x fino alla prima occorrenza di c.

# Fornire un algoritmo che, presi una stringa x, un carattere c e un numero d, restituisca la stringa ottenuta dai caratteri di x fino alla d-esima occorrenza di c. 

# Fornire un algoritmo che, presi una stringa x e un carattere c, restituisca la stringa ottenuta dai caratteri di x a partire dalla prima occorrenza di c.

# Fornire un algoritmo che, presi una stringa x, un carattere c e un numero d, restituisca la stringa ottenuta dai caratteri di x a partire dalla d-esima occorrenza di c.

# Fornire un algoritmo che, presa in input una stringa x, restituisca una stringa ottenuta invertendo l'ordine dei caratteri in x.

# Fornire un algoritmo che, prese in input due stringhe x e y, calcoli la stringa ottenuta togliendo da x i caratteri in y.

# Fornire un algoritmo che, prese in input due stringhe x e y, calcoli la stringa ottenuta concatenando x e y.

# Fornire una algoritmo che, prese due stringhe x e y, restituisca la stringa ottenuta concatenando i caratteri di x e di y alternati. 

# Fornire un algoritmo che, prese in input un numero arbitrario di stringhe, calcoli la stringa ottenuta concatenando tutte le stringhe date nell'ordine dato.

# Fornire un algoritmo che, prese in input due stringhe x e y, restituisca True se x è più lunga di y altrimenti restituisce False.

# Fornire un algoritmo che stabilisca se la stringa x occore in y.

# Fornire un algoritmo che, prese in input tre stringhe x, str1 e str2, restituisca True se str1 occorre in x più volte di str2; restituisce False altrimenti.

# Fornire un algoritmo che, prese in input due stringhe x e y, restituisca in output la stringa più lunga tra le due

# Fornire un algoritmo che, prese in input due stringhe x e y, restituisca quella tra le due che contiene più vocali. Se x e y contengono lo stesso numero di vocali allora verrà restituita la stringa x.

# Fornire un algoritmo che, prese in input tre stringhe x, y e z, restituisca in output la stringa (tra x e y) che contiene più occorrenze della stringa z. Se x e y contengono lo stesso numero di occorrenze di z, allora dovrà essere restituita la stringa x.

# Fornire un algoritmo che, presa una stringa x, restituisca l'insieme delle stringhe ottenute troncando x negli spazi vuoti. 

# Fornire un algoritmo che prese due stringhe verifiche che x e y siano contemporaneamente due stringhe palindrome

# Fornire un algoritmo che, preso un insieme di stringhe, stabilisca  quante volte una delle stringhe è sottostringa di una qualsiasi altra stringa.  

# Fornire un algoritmo che, prese due stringhe x e y, stabilisca che x è l'inversa di y

# Fornire un algoritmo che,  presa una lista L di stringhe restituisca una lista che contenga le stringhe di L aventi almeno due 'a' in una posizione compresa tra 3 e 9

# Fornire un algoritmo che, presa una lista di stringhe restituisca una stringa costituita dal primo e dall'ultimo  carattere di ogni elemento della lista

# Fornire un algoritmo che che presa una lista di stringhe restituisca una stringa costituita da tutte le stringhe della lista ma in ordine inverso

# Fornire un algoritmo che, prese due liste di caratteri, restituisca una stringa costituita dai caratteri delle due liste prese in ordine alternato (le due liste hanno la stessa dimensione).

# Fornire un algoritmo che, prese due liste di caratteri, restituisca una stringa costituita dai caratteri delle due liste prese in ordine alternato (le due liste possono avere dimensione diversa). Inserire i caratteri rimanenti a fine stringa.

# Fornire un algoritmo che, presa una stringa, stabilisca se contiene più vocali o consonanti (la stringa può contenere solo caratteri o consonanti).

# Fornire un algoritmo che, presa una stringa, stabilisca se contiene più vocali o consonanti (la stringa può contenere caratteri, consonanti, numeri e simboli).

# Fornire un algoritmo che, prese due liste di stringhe, restituisca una lista di stringhe così formata: il primo elemento è dato dalla concatenazione del primo elemento della prima lista con l'ultimo elemento della seconda lista; il secondo elemento è dato dalla concatenzazione del secondo elemento della prima lista con il penultimo della seconda lista e così via.

# Fornire un algoritmo che, prese due liste di stringhe, restiutisca una lista costituita dagli elementi della prima lista esclusi gli elementi che appartengono alla seconda lista.

# Si consideri una struttura dati (tupla o dizionario) che comprenda le seguenti informazioni: NOME STUDENTE, VOTO DI LAUREA. Fornire un algoritmo che prenda in input una sequenza di elementi organizzati nella struttura dati precedentemente indicata e restituisca la media del voto di laurea.   

# Si consideri una struttura dati (tupla o dizionario) che comprenda le seguenti informazioni: NOME STUDENTE, VOTO DI LAUREA. Fornire un algoritmo che prenda in input una sequenza di elementi organizzati nella struttura dati precedentemente indicata e restituisca l'elenco degli studenti che hanno avuto un voto di laurea non inferiore a 100.

# Si consideri una struttura dati (tupla o dizionario) che comprenda le seguenti informazioni: NOME STUDENTE, VOTO DI LAUREA. Fornire un algoritmo che prenda in input una sequenza di elementi organizzati nella struttura dati precedentemente indicata e restituisca l'elenco degli studenti che hanno avuto un voto di laurea non inferiore a 100 e il relativo voto conseguito.

# Si consideri una struttura dati (tupla o dizionario) che comprenda le seguenti informazioni: NOME STUDENTE, VOTO DI LAUREA, CORSO DI LAUREA. Fornire un algoritmo che prenda in input una sequenza di elementi organizzati nella struttura dati precedentemente indicata e restituisca per ogni corso di laurea presente la media del voto di laurea.

# Si consideri una struttura dati (tupla o dizionario) che comprenda le seguenti informazioni: NOME STUDENTE, VOTO, MATERIA. Si consideri inoltre una struttura dati che comprenda le seguenti informazioni: DOCENTE, MATERIA. Fornire un algoritmo che prenda in input una sequenza di elementi per ognuna delle strutture dati precedentemente indicate e restituisca  la media devi voti ottenuti dagli studenti per ogni docente e corso.

# Si consideri una struttura dati (tupla o dizionario) che comprenda le seguenti informazioni: NOME STUDENTE, VOTO, MATERIA. Si consideri inoltre una struttura dati che comprenda le seguenti informazioni: DOCENTE, MATERIA. Fornire un algoritmo che prenda in input una sequenza di elementi per ognuna delle strutture dati precedentemente indicate e restituisca il docente/i i cui studenti hanno ottenuto la media più alta.

# Scrivere un programma Python che presa una lista di stringhe nella forma "Nome Cognome Data_Nascita" (separati da uno spazio) restituisca  una lista di dizionari, uno per ogni elemeno della lista. Ogni dizionario deve avere come chiavi "Nome", "Cognome" ed "Data" e come valori i valori presi dai corrispondenti elementi della lista. 

# Scrivere un programma Python che prenda due liste di stringhe. La prima lista contiene delle stringhe nella forma "Nome Cognome" (separati da uno spazio), mentre la seconda lista contiene un elenco di date di nascita (una per ogni valore della prima lista).
  Il programma deve costruire una dizionario avente come chiavi "Nome-Completo" e "DataNascita". La prima è chiave è una tupla contenente il valore del "Nome" e del "Cognome" presi dai corrispondenti elementi della prima lista, mentre la seconda contiene i valori presi dai corrispondenti elementi della seconda lista. 

# Scrivere un programma Python che presa una lista di stringhe nella forma "Modello (Produttore)" (il produttore è indicato tra parentesi) restituisca  una lista di dizionari, uno per ogni elemeno della lista. Ogni dizionario deve avere come chiavi "Modello", "Produttore" e come valori i valori presi dai corrispondenti elementi della lista. 

# Scrivere un programma Python per ciascun esercizio evitando di usare i costrutti per la manipolazione delle stringhe (substring, ecc.)